<template>
	<u-popup :show="isShow" @close="isShow=false" mode="right" closeable>
		<view class="drag-and-drop-sort-B" :style="[containerSize]">
			<template v-if="controlsPositionArray.length !== 0">
				<view v-for="(item, index) in controlsArray" :key="item.sortId" class="_item"
					:style="{'background': item, 'transition': (curretnControlsIndex === index ? 'initial' : '.3s'), 'z-index': (curretnControlsIndex === index ? 1 : 0), 'width': controlsSize.width + 'px', 'height': controlsSize.height + 'px', 'top': controlsPositionArray[index].top + 'px',  'left': controlsPositionArray[index].left + 'px'}">
					<!-- 自定义内容 -->
					<view
						style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">
						<view class="coverage-item">
							<image src="../../static/images/icon/qingkong.png" mode="aspectFit" class="delete"
								@click="remove(item.sortId)"></image>
							<image :src="item.imageUrl" mode="aspectFit" class="image"></image>
							<view @touchstart.stop="handleTouchstart($event, item.sortId)" @touchmove="handleTouchmove"
								@touchend="handleTouchend" class="move">
								<image src="../../static/images/icon/cengji.png" mode="aspectFit"></image>
							</view>
						</view>
					</view>
				</view>
			</template>
		</view>

	</u-popup>
</template>

<script>
	export default {
		name: "drag-and-drop-sort-B",
		props: {
			// 容器大小
			containerSize: {
				type: Object,
				default: () => ({
					wdith: '100vw',
					height: '100vh'
				}),
			},
			// 控件的大小
			controlsSize: {
				type: Object,
				default: () => ({
					width: 0,
					height: 0
				}),
			},
			// 数据列表
			controlsList: {
				type: Array,
				default: () => [],
			},
		},
		data() {
			return {
				isShow: false,
				// 控件列表
				controlsArray: [],
				// 每行最大存放的个数
				maxWidthCount: 1,
				// 控件的间距
				margin: {
					margin_x: 0,
					margin_y: 10,
				},
				// 记录所有控件的初始位置
				recordInitControlsPoisitonList: [],
				// 控件的数据
				controlsPositionArray: [],
				// 记录当前手指的位置
				recordPosition: {
					x: 0,
					y: 0,
				},
				// 记录当前操作的控件数据
				recordControlsPositionItem: {},
				// 当前操作的控件的下标
				curretnControlsIndex: -1,
			};
		},
		mounted() {
			// 获取系统信息
			this.systemInfo = uni.getSystemInfoSync();
			// 获取控件列表
			this.controlsArray = this.controlsList;
			console.log(this.controlsArray);
			// 初始化控件的位置
			this.controlsPositionArray = this.initControlsPosition();
		},
		watch: {
			controlsList(newValue, oldValue) {
				// console.log('change', newValue);
				this.controlsArray = []
				this.$nextTick(() => {
					this.controlsArray = newValue
					this.controlsPositionArray = this.initControlsPosition()
				})
				// console.log(this.controlsArray.map(item => {
				// 	return item.id
				// }));

			}
		},
		methods: {
			/** 初始化各个控件的位置 */
			initControlsPosition() {
				// 用于返回出去的新数组
				let tempArray = [];

				// 设置控件位置
				for (let i = 0, j = 0; i < this.controlsList.length; i++, j++) {
					tempArray[i] = {
						left: this.margin.margin_x,
						top: j * (this.controlsSize.height + this.margin.margin_y) + this.margin.margin_y,
					}
				}

				// 记录数据 - 进行深拷贝
				this.recordInitControlsPoisitonList = [...tempArray];
				// 返回数据
				return tempArray;
			},

			/** 处理手指触摸后移动 */
			handleTouchmove(event) {
				const {
					pageX,
					pageY
				} = event.touches[0];

				// 获取移动的差
				this.controlsPositionArray[this.curretnControlsIndex] = {
					left: this.controlsPositionArray[this.curretnControlsIndex].left + (pageX - this.recordPosition.x),
					top: this.controlsPositionArray[this.curretnControlsIndex].top + (pageY - this.recordPosition.y),
				}
				// 记录位置
				this.recordPosition = {
					x: pageX,
					y: pageY
				};
				// 判断当前移动的位置是否需要进行排序
				// 向下移动
				if (this.curretnControlsIndex !== this.controlsPositionArray.length - 1 && this.controlsPositionArray[this
						.curretnControlsIndex].top > this.controlsPositionArray[this.curretnControlsIndex + 1].top) {
					// 交换位置
					this._handleChangeControlsPosition(0, this.curretnControlsIndex + 1);
				}
				// 向上移动
				else if (this.curretnControlsIndex !== 0 && this.controlsPositionArray[this.curretnControlsIndex].top <
					this.controlsPositionArray[this.curretnControlsIndex - 1].top) {
					// 交换位置
					this._handleChangeControlsPosition(0, this.curretnControlsIndex - 1);
				}
			},

			/** 处理手指触摸开始事件 */
			handleTouchstart(event, sortId) {
				let index = this.controlsArray.findIndex(item => {
					return item.sortId == sortId
				})
				console.log(sortId, index);
				const {
					pageX,
					pageY
				} = event.touches[0];

				// 记录一些数据
				this.curretnControlsIndex = index;
				this.recordPosition = {
					x: pageX,
					y: pageY
				};
				this.recordControlsPositionItem = this.controlsPositionArray[index];
			},

			/** 处理手指松开事件 */
			handleTouchend(event) {
				// 将操控的控件归位
				this.controlsPositionArray[this.curretnControlsIndex] = this.recordInitControlsPoisitonList[this
					.curretnControlsIndex];
				this.curretnControlsIndex = -1;
				// console.log('touchend', this.controlsArray.map((item,index) => {
				// 	return item.id + ' ' + index
				// }));
				this.$emit('changeIndex', this.controlsArray)
			},

			/**
			 * 处理交换控件位置的方法 - 
			 * @param {number} index	需要与第几个下标交换位置
			 * */
			_handleChangeControlsPosition(type, index) {
				// 记录当前操控的控件数据
				let tempControls = this.controlsArray[this.curretnControlsIndex];

				// 设置原来位置的数据
				this.controlsArray[this.curretnControlsIndex] = this.controlsArray[index];
				// 将临时存放的数据设置好
				this.controlsArray[index] = tempControls;

				// 调整控件位置数据
				this.controlsPositionArray[index] = this.controlsPositionArray[this.curretnControlsIndex];
				this.controlsPositionArray[this.curretnControlsIndex] = this.recordControlsPositionItem;

				// 改变当前选中的位置
				this.curretnControlsIndex = index;

				// 记录新位置的数据
				this.recordControlsPositionItem = this.recordInitControlsPoisitonList[this.curretnControlsIndex];
			},
			remove(data) {
				this.$emit('remove', data)
			},
		}
	}
</script>

<style scoped lang="scss">
	.drag-and-drop-sort-B {
		position: relative;
		margin-top: 190rpx;

		._item {
			position: absolute;
		}

		.coverage-item {
			margin: 17rpx 10rpx;
			background-color: #fff;
			.delete {
				height: 100rpx;
				width: 55rpx;
				position: relative;
				display: inline-block;
				padding: 10rpx;
				box-sizing: border-box;
			}

			.image {
				height: 100rpx;
				width: 100rpx;
				border: 2rpx solid;
				margin: 0 30rpx;
			}

			.move {
				height: 100rpx;
				width: 55rpx;
				position: relative;
				display: inline-block;
				padding: 10rpx;
				box-sizing: border-box;

				image {
					height: 100%;
					width: 100%;
				}
			}
		}
	}
</style>